/**
 【利用高阶函数实现AOP】
 JavaScript中实现AOP是指把一个函数“动态织入”到另一个函数之中

 AOP（面向切面编程）就是把一些与业务逻辑模块无关的功能抽离出来，
 如日志统计、安全控制、异常处理等，然后通过“动态织入”的方式掺入业务逻辑模块中。

 这样设计的好处是：首先可以保证业务逻辑模块的纯净和高内聚性；其次可以方便地复用日志统计等功能模块。


 示例
 在 JavaScript 中实现 AOP，一般是把一个函数“动态织入”到另外一个函数中。
 具体的实现方法有很多，下面通过扩展 Function.prototype 方法实现 AOP。
 */


Function.prototype.before = function(beforeFn){
    let that = this

    //返回包含了函数和新函数的代理函数
    return function(){
        // 拿到参数，注意如果上面return 箭头函数是不绑定arguments
        let args = arguments
        //执行回调函数 beforeFn
        beforeFn.apply(this,args)
        //执行原函数
        return that.apply(this,args)
    }
}

Function.prototype.after = function(afterFn){
    let that = this
    return function(){
        let args = arguments
        //执行原函数
        let result = that.apply(this,args)
        //执行回调函数 beforeFn
        afterFn.apply(this,args)
        //返回
        return result
    }
}





let fun = function(content){
    console.log('fn ',content)
}

fun = fun.before((content)=>{
    console.log('fn before',content)
}).after((content)=>{
    console.log('fn after',content)
})



fun(123) // fn before...    fn...    fn after...

